package com.study.lambda;

import org.junit.Test;

import java.util.Comparator;
import java.util.function.*;

/**
 * 1.方法引用：若Lambda表达式中的内容有方法已经实现了，我们可以使用“方法引用”
 *
 * 主要有三种语法:
 * 对象::实例方法名
 *
 * 类::静态方法名
 *
 * 类::实例方法名
 *
 * 2.构造器引用
 * ClassName::new
 *
 * 3.数组引用
 * Type::new
 * */
public class TestMethodRef {

    /**
     * 对象::方法名
     * */
    @Test
    public void test1(){
        Consumer<String> com=System.out::println;
        com.accept("str");
    }

    @Test
    public void test2(){
        Employee employee=new Employee(1001,"张三",13,1111.11);
        Supplier<String> supplier=()->employee.getName();
        System.out.println(supplier.get());
        System.out.println("=================================");
        Supplier<Integer> integerSupplier=employee::getAge;
        System.out.println(integerSupplier.get());
    }

    /**
     * 类::静态方法名
     * */
    @Test
    public void test3(){
        Comparator<Integer> comparator=(x,y)->Integer.compare(x,y);
        System.out.println(comparator.compare(1, 2));
        System.out.println("=============================");
        Comparator<Integer> com=Integer::compare;
        System.out.println(com.compare(1, 2));
    }

    /**
     * 类::实例方法名
     * */
    @Test
    public void test4(){
        BiPredicate<String,String> bp=(x,y)->x.equals(y);
        System.out.println(bp.test("str1", "str1"));
        System.out.println("=================================");
        BiPredicate<String,String> bp1=String::equals;
        System.out.println(bp1.test("str1", "str1"));
    }

    /**
     * 构造器引用
     * */
    @Test
    public void test5(){
        Supplier<Employee> supplier=Employee::new;//supplier的方法是无参构造，因此会调用无参构造
        System.out.println(supplier.get());
        System.out.println("====================================");
        Function<Integer,Employee> function=Employee::new;//function的apply方法具有一个参数，调用的为参数匹配的一个构造器函数
        System.out.println(function.apply(1001));
        System.out.println("====================================");
        BiFunction<Integer,Integer,Employee> function1=Employee::new;//bifunction的apply方法具有两个参数，调用的为参数匹配的两个构造器函数
        System.out.println(function1.apply(1001,18));

    }

    /**
     * 数组引用
     * */
    @Test
    public void test6(){
        Function<Integer,String[]> function=String[]::new;
        System.out.println(function.apply(10).length);
    }
}
